package com.sisgesbyte.dao.ventas;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.ClienteDatosGeneralesRequest;
import com.sisgesbyte.dao.beanDao.ClienteRegistroRequest;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.ventas.ClienteEntity;
import com.sisgesbyte.data.entity.ventas.NuevoClienteEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoClienteDaoImpl extends AbstractFacade<ClienteEntity>  implements MantenimientoClienteDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public MantenimientoClienteDaoImpl(){
		super(ClienteEntity.class);
	}
	
	@Override
	public List<ClienteEntity> listaClientes(FiltrosSQLBean cadenaFiltros) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("select c.id id_cliente,cl.id id_cliente_local ,cl.cod_local,cl.zona_id,c.categoria_cliente_id,cc.categoria categoria_cliente,c.cod_cliente,c.active active_cliente,");
		jpql.append("c.comun_objeto_id id_objeto_cliente ,co.tipo_identificacion_id,ti.descripcion tipo_identificacion,co.num_doc,");
		jpql.append("co.razon_social,co.nombre,co.apellido,co.fecha_nacimiento,co2.pais_id, p.nombre pais,");
		jpql.append("co2.division_pais_id,dp.nombre division_pais,ci.nombre ciudad,");
		jpql.append("co2.ciudad_id,co2.distrito_id,di.nombre distrito,cl.principal local_principal,cl.active local_activo ");
		jpql.append("from ventas.cliente c inner join comun.comun_objeto co on c.comun_objeto_id=co.id ");
		jpql.append("left join ventas.cliente_locales cl on cl.cliente_id=c.id ");
		jpql.append("left join administracion.categoria_cliente cc on c.categoria_cliente_id=cc.id ");
		jpql.append("left join comun.tipo_identificacion ti on co.tipo_identificacion_id=ti.id ");
		jpql.append("inner join comun.comun_objeto co2 on cl.comun_objeto_id=co2.id ");
		jpql.append("left join localizacion.pais p on co2.pais_id=p.id ");
		jpql.append("left join localizacion.division_pais dp on co2.division_pais_id=dp.id ");
		jpql.append("left join localizacion.ciudad ci on co2.ciudad_id=ci.id ");
		jpql.append("left join localizacion.distrito di on co2.distrito_id=di.id ");
		
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(), ClienteEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<ClienteEntity> ls = query.getResultList();

		return ls;
	}
	@Override
	public NuevoClienteEntity guardarCliente( ClienteDatosGeneralesRequest request) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from ventas.sp_registrar_cliente(:in_categoria_cliente_id, :in_comun_objeto_id , :in_active )");
		
		Query query = em.createNativeQuery(jpql.toString(), NuevoClienteEntity.class);
			query.setParameter("in_categoria_cliente_id", request.getIdCategoriaCliente());
			query.setParameter("in_comun_objeto_id", request.getIdObjetoComun());
			query.setParameter("in_active", request.getActiveCliente());

		return (NuevoClienteEntity) query.getSingleResult();
		
	}
	
	@Override
	public GenericEntity actualizarCliente(ClienteDatosGeneralesRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from ventas.sp_actualizar_cliente(:in_id, :in_categoria_cliente_id , :in_active )");
		
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_id", request.getIdCliente());
			query.setParameter("in_categoria_cliente_id", request.getIdCategoriaCliente());
			query.setParameter("in_active", request.getActiveCliente());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarCliente(int codCliente) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from ventas.sp_eliminar_cliente(:in_id_cliente)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_id_cliente", codCliente);

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity registroMasicoCliete(ClienteRegistroRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from ventas.sp_registrar_cliente_masivo(:in_tipo_identificacion, :in_numero_doc , :in_razon_social, :in_nombre_cliente, ");
		jpql.append(":in_apellido_cliente , :in_canal_id, :in_zona_id,:in_telefono, :in_email, :in_direccion, :in_pais_id, ");
		jpql.append(":in_region_id, :in_ciudad_id , :in_distrito_id, :in_local_principal, :in_active ) ");
		
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_tipo_identificacion", request.getTipoIdentificacionId());
			query.setParameter("in_numero_doc", request.getNumeroDoc());
			query.setParameter("in_razon_social", request.getRazonSocial());
			query.setParameter("in_nombre_cliente", request.getNombreCliente());
			query.setParameter("in_apellido_cliente", request.getApellidoCliente());
			query.setParameter("in_canal_id", request.getCanalId());
			query.setParameter("in_zona_id", request.getZonaId());
			query.setParameter("in_telefono", request.getTelefono());
			query.setParameter("in_email", request.getEmail());
			query.setParameter("in_direccion", request.getDireccion());
			query.setParameter("in_pais_id", request.getPaisId());
			query.setParameter("in_region_id", request.getRegionId());
			query.setParameter("in_ciudad_id", request.getCiudadId());
			query.setParameter("in_distrito_id", request.getDistritoId());
			query.setParameter("in_local_principal", request.getLocalPrincipal());
			query.setParameter("in_active", request.getActive());
			
		return (GenericEntity) query.getSingleResult();
	}

}
